package baidu

import (
	"encoding/json"
	"fmt"
	"github.com/spf13/viper"
	teamones_helper "github.com/teamones-open/go-helper"
)

var (
	ApiUrl      = ""
	PanApiUrl   = ""
	PcsApiUrl   = ""
	ApiKey      = ""
	SecretKey   = ""
	CallBackUrl = ""
	Path        = ""
)

func initConfig() {
	ApiUrl = viper.GetString("bcs.apiUrl")
	PanApiUrl = viper.GetString("bcs.panApiUrl")
	PcsApiUrl = viper.GetString("bcs.pcsApiUrl")
	ApiKey = viper.GetString("bcs.apiKey")
	SecretKey = viper.GetString("bcs.secretKey")
	CallBackUrl = viper.GetString("bcs.callBackUrl")
	Path = viper.GetString("bcs.path")
}

// 基础上传地址
func GetPanBasePath() (path string) {
	initConfig()
	return Path
}

// 获取授权码地址
func GetAuthorizeUrl() (url string) {

	initConfig()

	url = ""
	// 基本地址
	url += ApiUrl + "authorize?response_type=code"

	// 自己应用的API key
	url += "&client_id=" + ApiKey

	// 授权回调地址，可在获取应用AK,SK的页面【安全配置】入口进行配置
	url += "&redirect_uri=" + CallBackUrl

	// 固定参数，必须为basic,netdisk
	url += "&scope=basic,netdisk"

	// 授权页的展示方式
	url += "&display=tv"

	// 二维码授权方式
	url += "&qrcode=1"

	// 如传递“force_login=1”，则加载登录页时强制用户输入用户名和口令，不会从cookie中读取百度用户的登陆状态
	url += "&force_login=1"

	return
}

// 获取 access token 地址
func GetAccessTokenUrl(code string) (url string) {

	initConfig()

	url = ""

	// 基本地址
	url += ApiUrl + "token?grant_type=authorization_code"

	// 获取用户授权后得到的code
	url += "&code=" + code

	// 应用的API KEY
	url += "&client_id=" + ApiKey

	// 应用的SECRET KEY
	url += "&client_secret=" + SecretKey

	// 必须与获取授权code是传递的保持一致
	url += "&redirect_uri=" + CallBackUrl

	return
}

// 刷新Token
func GetRefreshTokenUrl(refreshToken string) (url string) {
	initConfig()

	url = ""

	// 基本地址
	url += ApiUrl + "token?grant_type=refresh_token"

	// 更新token
	url += "&refresh_token=" + refreshToken

	// 应用的API KEY
	url += "&client_id=" + ApiKey

	// 应用的SECRET KEY
	url += "&client_secret=" + SecretKey

	return
}

// 获取用户信息
func GetUserInfoUrl(accessToken string) (url string) {

	initConfig()

	url = ""
	// 基本地址
	url += PanApiUrl + "/rest/2.0/xpan/nas?method=uinfo"

	// 应用的accessToken
	url += "&access_token=" + accessToken

	return
}

// 获取网盘容量信息
func GetPanVolumeUrl(accessToken string) (url string) {

	initConfig()

	url = ""
	// 基本地址
	url += PanApiUrl + "/api/quota"

	// 应用的accessToken
	url += "?access_token=" + accessToken

	// 是否检查免费信息，0为不查，1为查，默认为0
	url += "&checkfree=1"

	// 是否检查过期信息，0为不查，1为查，默认为0
	url += "&checkexpire=1"

	return
}

// 预上传接口地址
func GetPanPreCreateUrl(accessToken string) (url string) {
	initConfig()

	url = ""

	// 基本地址
	url += PanApiUrl + "/rest/2.0/xpan/file?method=precreate"

	// 应用的accessToken
	url += "&access_token=" + accessToken

	return
}

// 分片上传
func GetPanUploadUrl(accessToken string) (url string) {
	initConfig()

	url = ""

	// 基本地址
	url += PcsApiUrl + "/rest/2.0/pcs/superfile2?method=upload"

	// 应用的accessToken
	url += "&access_token=" + accessToken

	return
}

// 创建文件夹 （路由方法同创建文件，参数不一样）
func GetPanCreateUrl(accessToken string) (url string) {
	initConfig()

	url = ""

	// 基本地址
	url += PanApiUrl + "/rest/2.0/xpan/file?method=create"

	// 应用的accessToken
	url += "&access_token=" + accessToken

	return
}

// 获取文件列表
func GetPanFileListUrl(accessToken string, dirName string, start, limit int64, order string) (url string) {
	initConfig()

	url = ""

	// 基本地址
	url += PanApiUrl + "/rest/2.0/xpan/file?method=list"

	// 应用的accessToken
	url += "&access_token=" + accessToken

	// 应用的accessToken
	url += "&dir=" + dirName

	// 是否检查免费信息，0为不查，1为查，默认为0
	url += "&checkfree=1"

	// 是否检查过期信息，0为不查，1为查，默认为0
	url += "&checkexpire=1"

	if start > 0 {
		url += "&start=" + teamones_helper.StrVal(start)
	}
	if limit > 0 {
		url += "&limit=" + teamones_helper.StrVal(limit)
	}
	if order != "" {
		url += "&order=" + order
	}
	return
}

// 查询文件信息
func GetFileMetasUrl(accessToken string, Fsids []uint64, thumb int, dlink int, extra int) (url string) {
	initConfig()

	url = ""

	// 基本地址
	url += PanApiUrl + "/rest/2.0/xpan/multimedia?method=filemetas"

	// 应用的accessToken
	url += "&access_token=" + accessToken
	fsids, _ := json.Marshal(Fsids)
	// 文件id数组，数组中元素是uint64类型，数组大小上限是：100
	url += "&fsids=" + string(fsids)

	// 需要缩略图
	url += fmt.Sprintf("&thumb=%d", thumb)

	// 需要下载地址
	url += fmt.Sprintf("&dlink=%d", dlink)

	// 需要图片的拍摄时间
	url += fmt.Sprintf("&extra=%d", extra)

	return
}

// 获取文件列表
func GetPanFileListAllUrl(accessToken string, dirName string, start, limit int, order string) (url string) {
	initConfig()

	url = ""

	// 基本地址
	url += PanApiUrl + "/rest/2.0/xpan/multimedia?method=listall"

	// 应用的accessToken
	url += "&access_token=" + accessToken

	// 应用的accessToken
	url += "&path=" + dirName

	if start > 0 {
		url += "&start=" + teamones_helper.StrVal(start)
	}
	if limit > 0 {
		url += "&limit=" + teamones_helper.StrVal(limit)
	}
	if order != "" {
		url += "&order=" + order
	}
	return
}

func GetFileManageUrl(token string, opra string) (requestUrl string) {
	initConfig()

	requestUrl = ""
	// 基本地址
	requestUrl += PanApiUrl + "/rest/2.0/xpan/file?method=filemanager"

	// 操作
	requestUrl += "&opera=" + opra

	// 应用的accessToken
	requestUrl += "&access_token=" + token

	return
}
